package com.gaber.test;

import javax.naming.InsufficientResourcesException;
import java.io.*;
import java.rmi.RemoteException;
import java.sql.SQLOutput;
import java.util.Scanner;

public class Throwable {
    public static void main(String[] args) {
//        ExcepTest();
//        checkNumber(-9);
//        ExcepTest1();
//        RunoobTest();
//        RunoobTest1();
//        RunoobTest2();
    }

    //    有两个元素的一个数组，当代码试图访问数组的第四个元素的时候就会抛出一个异常。
    public static void ExcepTest() {
        try {
            int a[] = new int[2];
            System.out.println("Access element three:" + a[3]);
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Exception thrown :" + e);
        }
        System.out.println("Out of the block");
    }

//    public static void FileInputStreamTest() {
//        try {
//            file = new FileInputStream(fileName);
//            x = (byte) file.read();
//        } catch (FileNotFoundException  e) {
//            e.printStackTrace();
//            return -1;
//        } catch (IOException i) {
//            i.printStackTrace();
//            return -1;
//        }
//    }

    /**
     * throws/throw 关键字
     * 在Java中， throw 和 throws 关键字是用于处理异常的。
     *
     * throw 关键字用于在代码中抛出异常，而 throws 关键字用于在方法声明中指定可能会抛出的异常类型。
     * */

    /**
     * throw 关键字
     * throw 关键字用于在当前方法中抛出一个异常。
     * 通常情况下，当代码执行到某个条件下无法继续正常执行时，可以使用 throw 关键字抛出异常，以告知调用者当前代码的执行状态。
     * 例如，下面的代码中，在方法中判断 num 是否小于 0，如果是，则抛出一个 IllegalArgumentException 异常。
     */
    public static void checkNumber(int num) {
        if (num < 0) {
            throw new IllegalArgumentException("Number must be positive");
        }
    }

    /**
     * throws 关键字用于在方法声明中指定该方法可能抛出的异常。当方法内部抛出指定类型的异常时，该异常会被传递给调用该方法的代码，并在该代码中处理异常。
     * <p>
     * 例如，下面的代码中，当 readFile 方法内部发生 IOException 异常时，会将该异常传递给调用该方法的代码。在调用该方法的代码中，必须捕获或声明处理 IOException 异常。
     */
    public static void readFile(String filePath) throws IOException {
        BufferedReader reader = new BufferedReader(new FileReader(filePath));
        String line = reader.readLine();
        while (line != null) {
            System.out.println(line);
            line = reader.readLine();
        }
        reader.close();
    }

    /**
     * 一个方法可以声明抛出多个异常，多个异常之间用逗号隔开。
     * 例如，下面的方法声明抛出 RemoteException 和 InsufficientFundsException：
     */
    public static void withdraw(double amount) throws RemoteException, InsufficientResourcesException {

    }

    /**
     * 注意下面事项：
     * <p>
     * catch 不能独立于 try 存在。
     * 在 try/catch 后面添加 finally 块并非强制性要求的。
     * try 代码后不能既没 catch 块也没 finally 块。
     * try, catch, finally 块之间不能添加任何代码。
     */
    public static void ExcepTest1() {
        int a[] = new int[2];
        try {
            System.out.println("Access element three:" + a[3]);
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Exception thrown :" + e);
        } finally {
            a[0] = 6;
            System.out.println("First element value:" + a[0]);
            System.out.println("The finally statement is executed");
        }
        System.out.println("Out of the block");
    }

    public static void RunoobTest() {
        String line;
        try(BufferedReader br = new BufferedReader(new FileReader("test.txt")) ) {
            while ((line = br.readLine()) != null) {
                System.out.println("line =>" + line);
            }
        } catch (IOException e) {
            System.out.println("IOException is try block =>" + e.getMessage());
        }
    }

    public static void RunoobTest1() {
        BufferedReader  br = null;
        String line;
        try {
            System.out.println("Enter try block");
            br = new BufferedReader(new FileReader("test.txt"));
            while ((line = br.readLine()) != null) {
                System.out.println("Line =>" + line);
            }
        } catch (IOException e) {
            System.out.println("IOException in try block =>" + e.getMessage());
        } finally {
            System.out.println("Enter finally block");
            try {
                if(br != null) {
                    br.close();
                }
            } catch (IOException e) {
                System.out.println("IOException in finally block =>" + e.getMessage());
            }
        }
    }

    public static void RunoobTest2() throws IOException {
        try (Scanner scanner =  new Scanner(new File("testRead.txt"))) {
            PrintWriter writer = new PrintWriter(new File("testWrite.txt"));
            while ((scanner.hasNext())) {
                writer.print(scanner.nextLine());
            }
        }
    }

}


